package program.test.list;

import program.linkedlist.LinkedListV2;

/**
 * 删除链表中等于给定值 val 的所有节点。
 * <p>
 * 示例:
 * <p>
 * 输入: 1->2->6->3->4->5->6, val = 6
 * 输出: 1->2->3->4->5
 * <p>
 * 来源：力扣（LeetCode）
 * 链接：https://leetcode-cn.com/problems/remove-linked-list-elements
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 * <p>
 * 解法2: 创建dummyHead, 这样就可以去除掉对于head节点的特殊操作.
 */
public class LeetCode203_v2 {

    private class ListNode {
        public int val;
        public ListNode next;

        public ListNode(int x) {
            val = x;
        }

        public ListNode(int[] dataGroup) {
            if (dataGroup == null || dataGroup.length == 0) {
                throw new IllegalArgumentException("arr is empty!");
            }

            this.val = dataGroup[0];
            ListNode cur = this;
            for (int i = 1; i < dataGroup.length; i++) {
                cur.next = new ListNode(dataGroup[i]);
                cur = cur.next;
            }
        }

        @Override
        public String toString() {
            StringBuilder result = new StringBuilder();
            ListNode cur = this;
            while (cur != null) {
                result.append(cur.val).append("->");
                cur = cur.next;
            }

            result.append("Null");
            return result.toString();
        }
    }

    public ListNode removeElements(ListNode head, int val) {
        // 1.这样head也有了前置节点, 就不需要和v1中对于head的特殊处理.
        ListNode dummyHead = new ListNode(-1);
        dummyHead.next = head;

        ListNode pre = dummyHead;
        while (pre.next != null) {
            if (pre.next.val == val) {
                ListNode delNode = pre.next;
                pre.next = delNode.next;
                delNode.next = null;
            } else {
                pre = pre.next;
            }
        }

        // 应该返回dummyHead的下一个节点, 不能让用户觉得多了节点.
        return dummyHead.next;
    }
}


